home *** CD-ROM | disk | FTP | other *** search
/ Programming an RTS Game with Direct3D / Programming an RTS Game with Direct3D.iso / Examples / Chapter 5 / Example 5.1 / camera.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-06-29  |  3.0 KB  |  130 lines

  1. #include "camera.h"
  2.  
  3. CAMERA::CAMERA()
  4. {
  5.     Init(NULL);
  6. }
  7.  
  8. void CAMERA::Init(IDirect3DDevice9* Dev)
  9. {
  10.     m_pDevice = Dev;
  11.     m_alpha = m_beta = 0.5f;
  12.     m_radius = 200.0f;
  13.     m_fov = D3DX_PI / 4.0f;
  14.  
  15.     m_eye = D3DXVECTOR3(50.0f, 50.0f, 50.0f);
  16.     m_focus = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
  17. }
  18.  
  19. void CAMERA::Scroll(D3DXVECTOR3 vec)
  20. {
  21.     D3DXVECTOR3 newFocus = m_focus + vec;
  22.  
  23.     if(newFocus.x > -50.0f && newFocus.x < 50.0f &&
  24.        newFocus.z > -50.0f && newFocus.z < 50.0f)
  25.        m_focus = newFocus;
  26. }
  27.  
  28. void CAMERA::Pitch(float f)
  29. {
  30.     m_beta += f;
  31.  
  32.     if(m_beta > D3DX_PI / 2.0f)m_beta = D3DX_PI / 2.0f - 0.01f;
  33.     if(m_beta < 0.3f)m_beta = 0.3f;
  34. }
  35.  
  36. void CAMERA::Yaw(float f)
  37. {
  38.     m_alpha += f;
  39.     if(m_alpha > D3DX_PI * 2.0f)m_alpha -= D3DX_PI * 2.0f;
  40.     if(m_alpha < -D3DX_PI * 2.0f)m_alpha += D3DX_PI * 2.0f;
  41. }
  42.  
  43. void CAMERA::Zoom(float f)
  44. {
  45.     m_fov += f;
  46.  
  47.     if(m_fov < 0.1f)m_fov = 0.1f;
  48.     if(m_fov > D3DX_PI / 2.0f)m_fov = D3DX_PI / 2.0f;
  49. }
  50.  
  51. void CAMERA::ChangeRadius(float f)
  52. {
  53.     m_radius += f;
  54.  
  55.     if(m_radius < 5.0f)m_radius = 5.0f;
  56.     if(m_radius > 400.0f)m_radius = 400.0f;
  57. }
  58.  
  59. void CAMERA::Update(float timeDelta)
  60. {
  61.     //Restrict focus movment to the xz-plane
  62.     m_right.y = m_look.y = 0.0f;
  63.     D3DXVec3Normalize(&m_look, &m_look);
  64.     D3DXVec3Normalize(&m_right, &m_right);
  65.  
  66.     //Move Focus (i.e. Scroll)
  67.     if(KEYDOWN(VK_LEFT))Scroll(-m_right * timeDelta * 20.0f);
  68.     if(KEYDOWN(VK_RIGHT))Scroll(m_right * timeDelta * 20.0f);
  69.     if(KEYDOWN(VK_UP))Scroll(m_look * timeDelta * 20.0f);
  70.     if(KEYDOWN(VK_DOWN))Scroll(-m_look * timeDelta * 20.0f);
  71.  
  72.     //Move Camera (i.e. Change Angle)
  73.     if(KEYDOWN('A'))Yaw(-timeDelta);
  74.     if(KEYDOWN('D'))Yaw(timeDelta);
  75.     if(KEYDOWN('W'))Pitch(timeDelta);
  76.     if(KEYDOWN('S'))Pitch(-timeDelta);
  77.     
  78.     if(KEYDOWN(VK_SHIFT))
  79.     {
  80.         //Zoom (i.e. change m_fov)
  81.         if(KEYDOWN(VK_ADD))Zoom(-timeDelta);
  82.         if(KEYDOWN(VK_SUBTRACT))Zoom(timeDelta);
  83.     }
  84.     else
  85.     {
  86.         //Change m_radius
  87.         if(KEYDOWN(VK_ADD))ChangeRadius(-timeDelta * 100.0f);
  88.         if(KEYDOWN(VK_SUBTRACT))ChangeRadius(timeDelta * 100.0f);
  89.     }
  90.  
  91.     //Calculate Eye Position
  92.     float sideRadius = m_radius * cos(m_beta);
  93.     float height = m_radius * sin(m_beta);
  94.  
  95.     m_eye = D3DXVECTOR3(m_focus.x + sideRadius * cos(m_alpha),
  96.                         m_focus.y + height, 
  97.                         m_focus.z + sideRadius * sin(m_alpha));
  98.  
  99.     if(m_pDevice != NULL)
  100.     {
  101.         m_pDevice->SetTransform(D3DTS_VIEW, &GetViewMatrix());
  102.         m_pDevice->SetTransform(D3DTS_PROJECTION, &GetProjectionMatrix());
  103.     }
  104. }
  105.  
  106. D3DXMATRIX CAMERA::GetViewMatrix()
  107. {
  108.     D3DXMATRIX  matView;
  109.     D3DXMatrixLookAtLH(&matView, &m_eye, &m_focus, &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
  110.  
  111.     m_right.x = matView(0,0);
  112.     m_right.y = matView(1,0);
  113.     m_right.z = matView(2,0);
  114.     D3DXVec3Normalize(&m_right, &m_right);
  115.  
  116.     m_look.x = matView(0,2);
  117.     m_look.y = matView(1,2);
  118.     m_look.z = matView(2,2);
  119.     D3DXVec3Normalize(&m_right, &m_right);
  120.  
  121.     return  matView;
  122. }
  123.  
  124. D3DXMATRIX CAMERA::GetProjectionMatrix()
  125. {
  126.     D3DXMATRIX  matProj;
  127.     float aspect = 800.0f / 600.0f;
  128.     D3DXMatrixPerspectiveFovLH(&matProj, m_fov, aspect, 1.0f, 1000.0f );
  129.     return matProj;
  130. }